Extra-Variablen für BASIC-Programme


Mit dem beiliegenden CCBASIC-Compiler für DOS (CCBAS.EXE) ist es möglich, mehr als die üblichen 24 Byte- oder 12 Wordvariablen in BASIC-Programmen zu verwenden. Bei der CCBAS.EXE-Datei handelt es sich um den Original-Compiler von Conrad Electronic, der allerdings an einer Stelle etwas verändert ("gepatcht") worden ist. Bitte diese HTML-Seite erst komplett durchlesen, bevor die neuen Extra-Variablen verwendet werden!!
 

Einführung

Die Standard-Variablen stehen bei der C-Control bekanntlich im User-RAM (ab Adresse $a1 bis $b8). Wenn der CCBASIC-Compiler für DOS (CCBAS.EXE) oder Windows (CCBAS32.DLL) wie unten beschrieben gepatcht wird, dann kann auch der Speicher hinter dem User-RAM ganz normal über Variablen angesprochen werden. Allerdings wird der Speicherbereich meist auch vom Betriebssystem benutzt und es gibt deshalb bestimmte Dinge zu beachten, wenn die Extra-Variablen verwendet werden. Es ist aber in (fast) jedem Anwendungsfall möglich, rund 12 Byte- oder 6 Wordvariablen zusätzlich "herauszuholen".
 

Hintergrund

In der Programmdatei CCBAS.EXE steht ab Offset $1fba7 eine Tabelle, die die höchstmögliche Anzahl von Variablen festlegt, die mit Hilfe des DEFINE-Befehls definiert werden können. Allerdings werden diese Werte nur dann beachtet, wenn ein DEFINE-Befehl mit Index verwendet wird (also z.B. "DEFINE var BYTE [1]"), mit dem ja bekanntlich der Programmierer selbst die Stelle festlegen kann, an der eine Variable im Speicher abgelegt wird. Ohne die Angabe eines Indexes werden die Variablen vom Compiler automatisch positioniert. Beim automatischen Positionieren zählt der Compiler aber nicht die Anzahl der definierten Variablen, und so können beliebig viele Variablen angelegt werden, ohne daß der Compiler eine Warnung ausgibt. Das ist ein schwerer Bug im Compiler, der schon vielen Anwendern schlaflose Nächte beschert hat, denn alle Variablen, die nicht mehr in das User-RAM passen, können unter Umständen wichtige Systemdaten überschreiben.

Es wäre also theoretisch möglich, einige Variablen im Datenbereich hinter dem User-RAM anzusiedeln. Allerdings müßte der Programmierer dabei genau mitzählen, wie viele (und welche) Variablen bisher definiert wurden und wo diese vom Compiler im Speicher abgelegt werden, denn sie können ja nur mit Hilfe der "automatischen Methode" definiert werden. Bei DEFINE plus Index macht der Compiler einen Strich durch die Rechnung, da er nur einen maximalen Index erlaubt. Die erste Methode ist aber sehr mühselig und fehleranfällig. Die Angabe eines Indexes ist in jedem Fall sicherer.

In der beiliegenden CCBAS.EXE wurden deshalb zwei Werte in der Tabelle ab Offset $1fba7 abgeändert. Dadurch können bis zu 256 Byte- und 128 Wordvariablen auch mit Hilfe eines Indexes definiert und so an exakter Stelle im Bereich hinter dem User-RAM plaziert werden. Von diesen neuen Variablen darf der Programmierer aber - wie bereits oben erläutert - nicht alle benutzen!
 

Die benutzbaren Variablen

In der folgenden Tabelle ist aufgeführt, unter welchen Umständen die diversen neuen Byte- und Wordvariablen benutzt werden dürfen. Hierbei gibt BYTE- und WORDINDEX die Zahl an, die beim DEFINE-Befehl als Index angegeben wurde (z.B. "DEFINE var BYTE [60]" oder "DEFINE var WORD [35]").
 
BYTEINDEX WORDINDEX ZU BEACHTEN
1 bis 24 1 bis 12 diese Variablen stehen im ganz normalen User-RAM; es gibt nichts zu beachten
25 bis 28 13 bis 14 es kann keine IRQ-BASIC-Interruptroutine benutzt werden; der IRQ-Pin des Prozessors muß auf ein festes Potential gelegt werden!; die Variablen sind gut verwendbar, denn eine Interruptroutine ist ohnehin nur bei der M-Unit benutzbar - und auch dort nur mit Tricks
29 bis 31 15  es darf kein SYS-Befehl benutzt werden - bzw. wenn BYTE [29] nicht benutzt wird, dann überschreibt ein SYS die Variablen auf BYTE [30] und BYTE [31]
32 bis 39 17 bis 19 diese Variablen liegen im GOSUB-Stack und sind deshalb nicht verwendbar
40 bis 45 21 bis 22 die Datendatei im seriellen EEPROM darf nicht benutzt werden
46 bis 52 24 bis 26 viele Betriebssystemroutinen benutzen diesen Speicherbereich zur temporären Datenspeicherung; siehe ROM-Listing
53 bis 54 27  es darf nicht in die Datendatei (mittels PRINT#) geschrieben werden 
55 bis 56 28  wird von der RS232 überschrieben; darf nur benutzt werden, wenn RXD auf  festem Potential liegt
57 bis 58 29  viele Betriebssystemroutinen benutzen diesen Speicherbereich zur temporären Datenspeicherung; siehe ROM-Listing
59  wird von der SQR-Funktion benutzt
60  dieses Byte wird offenbar nicht vom Betriebssystem benutzt
61 bis 64  31 bis 32 Code zur Erweiterung der Adressmodi (Pseudo-Adressierungsmodi); nicht verwendbar
65 letztes ueber den I2C-Bus uebertragenes Byte; nicht verwendbar
66 bis 68  34 wird für Zeitberechnungen benutzt; nicht verwendbar
69 bis 76 35 bis 38 hier liegt der Hardwarestack; sehr gut verwendbar wenn keine Assemblerprogramme mittels SYS aufgerufen werden; nur teilweise verwendbar, wenn im Assemblerprogramm mehr als zwei Unterprogrammverschachtelungen auftauchen
77 bis 95  39 bis 47  dieser Teil des Hardwarestacks wird vom Betriebssystem auf jeden Fall benötigt, es sei denn, man schaltet einige Interrupts aus; nicht verwendbar
96 - Options register (OPTR); nicht verwendbar
97 bis 256 49 bis 128 Teil des internen EEPROMs (Adresse $101 bis $1a0); kann nur ausgelesen werden; evt. könnte man hier Parameter speichern, die ein BASIC-Programm nur lesen muß oder die nur selten geändert werden
.
Speziell der Bereich des Hardwarestacks (BYTE [69] bis BYTE [76], bzw. WORD [35] bis WORD [38]) kann sehr gut benutzt werden, um zusätzliche Variablen zu speichern. Wenn allerdings vom SYS-Befehl Gebrauch gemacht wird, dann sollte aufgepaßt werden.

Zu beachten ist schließlich noch, daß die Extra-Variablen vom Betriebssystem nach einem Reset natürlich nicht initialisiert (d.h. auf Null gesetzt) werden. Das muß im BASIC-Programm geschehen. Außerdem ist aus obenstehender Tabelle ersichtlich, daß ein Schreiben in die falsche Variable das C-Control-System zum Absturz bringen kann. Das Lesen ist aber in jedem Fall erlaubt.
 

Installation

Um den neuen CCBASIC-Compiler zu installieren, ist nichts weiter nötig, als die alte CCBAS.EXE-Datei, die im gleichen
Verzeichnis stehen müßte, in dem auch die DOS-IDE (CCE.EXE) installiert wurde, durch die neue Datei zu ersetzen. Das ZIP-Archiv, in dem der neue Compiler und diese HTML-Seite enthalten waren, beinhaltet auch einen BASIC-Quellcode (TEST.BAS). Hiermit kann überprüft werden, ob die Installation fehlerfrei durchgeführt wurde.
 

Technisches

Zum Schluß gebe ich hier für alle "Hardcore-User" noch schnell das Format der Tabelle an, die die maximal mögliche Anzahl von Variablen und Ports festlegt, die mit Hilfe des DEFINE-Befehls definiert werden können. Sie befindet sich in der Programmdatei CCBAS.EXE an Offset $1fba7 und enthält Words (16-Bit-Zahlen). Alle "Mausschubser" können sich ihre CCBAS32.DLL natürlich auch umpatchen. In der DLL stehen die Parameter in der gleichen Reihenfolge an Offset $11f90 und sind Longwords (32 Bit-Zahlen).
 
 c0 00  18 00  0c 00  10 00  02 00  01 00  08 00  02 00        00 00  00 00
 ^      ^      ^      ^      ^      ^      ^      ^
 |      |      |      |      |      |      |      |
 |      |      |      |      |      |      |      D/A-Ports
 |      |      |      |      |      |      |
 |      |      |      |      |      |      A/D-Ports
 |      |      |      |      |      |
 |      |      |      |      |      Wordports
 |      |      |      |      |
 |      |      |      |      Byteports
 |      |      |      |
 |      |      |      Digitalports
 |      |      |
 |      |      Wordvariablen
 |      |
 |      Bytevariablen
 |
 Bitvariablen
.
In der beiliegenden CCBAS.EXE wurden drei aufeinanderfolgende Bytes an Offset $1FBA9 von $18 $00 $0c nach $00 $01 $80 umgepatcht.
 

Tips und Tricks

Man könnte natürlich noch mehr tricksen: Z.B. könnte die Anzahl der Byteports "vergrößert" werden und auf diese Weise jede RAM-Speicherstelle ab Adresse 1 ausgelesen (und NUR ausgelesen) werden. Über D/A-Ports könnten alle RAM-Adressen ab $a beschrieben (und NUR beschrieben) werden. Das würde allerdings zu weit führen und die Übersichtlichkeit nicht gerade fördern - zumal die Indexe der "Extra-Byteports" und der "Extra-D/A-Ports" für gleiche RAM-Speicherstellen unterschiedlich sein würden!
 

Viel Spaß mit den neuen Extra-Variablen!
 
  

     __                          _    ,          _
    /  )     _/_                ' )  /          //
   /  / o _  /  ____  __.  __    /--/ __.  __  // _____
()/__/_<_</_<__/ / /_(_/|_/ (   /  (_(_/|_/ (_</_(_) \_)__
(Dietmar Harlos, Student der Elektrotechnik, Universität Paderborn)

 

Diese HTML-Seite wurde von Dietmar Harlos am 1. September 2000 erstellt. Alle Angaben sind ohne Gewähr. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Der Autor kann für Fehler und deren Folgen weder eine juristische Verantwortung noch irgendeine andere Haftung übernehmen. Der Anwender nutzt alle Informationen auf eigenes Risiko. Teile dieser HTML-Seite dürfen an Dritte weitergegeben werden, wenn die Quelle genannt wird.